﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OWLServer.owl.tipos
{
    /// <summary>
    /// Clase que representa una clase en una ontología.
    /// </summary>
    public class Clase : ElementoRestringido
    {
        private IList<Clase> padresClases;
        private IList<Clase> hijasClases;
        private IList<Clase> equivalentes;
        private IList<Clase> disjuntas;
        private IList<UnionClasesDisjuntas> unionesClasesDisjuntas;
        private IList<Propiedad> clavesPropiedadDato;
        private IList<PropiedadObjeto> clavesPropiedaObjeto;

        /// <summary>
        /// Clases padre de esta clase
        /// </summary>
        public virtual IList<Clase> PadreClases
        {
            get { return padresClases; }
            set { padresClases = value; }
        }

        /// <summary>
        /// Clases hijas de esta clase
        /// </summary>
        public virtual IList<Clase> HijasClases
        {
            get { return hijasClases; }
            set { hijasClases = value; }
        }

        /// <summary>
        /// Clases equivalentes a esta
        /// </summary>
        public virtual IList<Clase> Equivalentes
        {
            get { return equivalentes; }
            set { equivalentes = value; }
        }

        /// <summary>
        /// Clases disjuntas a estas
        /// </summary>
        public virtual IList<Clase> Disjuntas
        {
            get { return disjuntas; }
            set { disjuntas = value; }
        }

        /// <summary>
        /// Unión de Clases disjuntas a estas
        /// </summary>
        public virtual IList<UnionClasesDisjuntas> UnionesClasesDisjuntas
        {
            get { return unionesClasesDisjuntas; }
            set { unionesClasesDisjuntas = value; }
        }

        /// <summary>
        /// Claves de tipo propiedad dato
        /// </summary>
        public virtual IList<Propiedad> ClavesPropiedadDato
        {
            get { return clavesPropiedadDato; }
            set { clavesPropiedadDato = value; }
        }

        /// <summary>
        /// Claves de tipo propiedad dato
        /// </summary>
        public virtual IList<PropiedadObjeto> ClavesPropiedadObjeto
        {
            get { return clavesPropiedaObjeto; }
            set { clavesPropiedaObjeto = value; }
        }

        public Clase() { }

        public Clase(string id) : base(id)
        {
            inicializarListas();
        }

        public Clase(Elemento elemento)
            : base(elemento)
        {
            inicializarListas();
        }

        public Clase(string id, EspacioNombres espacioNombres)
            : base(id, espacioNombres)
        {
            inicializarListas();
        }

        /// <summary>
        /// Inicializa las listas de elementos
        /// </summary>
        private void inicializarListas(){
            HijasClases = new List<Clase>();
            PadreClases = new List<Clase>();
            Disjuntas = new List<Clase>();
            Equivalentes = new List<Clase>();
            ClavesPropiedadDato = new List<Propiedad>();
            ClavesPropiedadObjeto = new List<PropiedadObjeto>();
            UnionesClasesDisjuntas = new List<UnionClasesDisjuntas>();
        }

        /// <summary>
        /// Devuelve la lista de clases hijas en un Diccionario
        /// </summary>
        /// <returns>Diccionario de subclases</returns>
        public virtual IDictionary<string, Clase> getHijasClaseDictiorary()
        {
            return HijasClases.ToDictionary(e => e.ToString(), e => e);
        }

        /// <summary>
        /// Devuelve la lista de clases padre en un Diccionario
        /// </summary>
        /// <returns>Diccionario de subclases</returns>
        public virtual IDictionary<string, Clase> getPadresClasesDictiorary()
        {
            return PadreClases.ToDictionary(e => e.ToString(), e => e);
        }

        /// <summary>
        /// Devuelve la lista de clases equivalentes en un Diccionario
        /// </summary>
        /// <returns>Diccionario de equivalentes</returns>
        public virtual IDictionary<string, Clase> getEquivalentesDictiorary()
        {
            return Equivalentes.ToDictionary(e => e.ToString(), e => e);
        }

        /// <summary>
        /// Devuelve la lista de clases disjuntas en un Diccionario
        /// </summary>
        /// <returns>Diccionario de disjuntas</returns>
        public virtual IDictionary<string, Clase> getDisjuntasDictiorary()
        {
            return Disjuntas.ToDictionary(e => e.ToString(), e => e);
        }
    }
}
